/**
 *  实现此方法，必须实现 方法  genSeriObj 实例化对象所需的字段集合
 *  另外可以重写  seriType （对应class信息 SeriType class）  和  seriVersion 校验用，必须满足一定关系，暂时没用， 建议数字，越大说明版本越高，默认1
 *  举例：
 *  
	genSeriObj(){
		return {};
    }
	
	需要实现 seri(obj){} 方法， obj 对应 genSeriObj 中返回值
	举例参考：
	seri(str){
		let obj = {};
		if(typeof(str) == "string"){
			obj = JSON.parse(str);
			if(obj.obj){
				obj = obj.obj;
			}
		}else{
			obj = str;
		}
		this.#name =  jsonSeriableUtil.seri(obj.name);
	}
	
 */
import jsonSeriableUtil from "../core/jsonSeriableUtil"
import {seriUniCode} from "./jsonSeriableConstants"
export default class JsonSeriable{
	
	#seriType;
	#seriVersion;
	
	constructor(seriType,seriVersion){
		this.#seriType = seriType;
		this.#seriVersion = seriVersion || 1;
	}
	
	toSeriStr(){
		return JSON.stringify(this.toSeriObj());
	}
	// 需要重写此方法
	genSeriObj(){
		return null;
	}
	// 需要重写此方法 或 seriObj方法
	seri(str){
		let obj = {};
		if(typeof(str) == "string"){
			obj = JSON.parse(str);
			if(obj.obj){
				obj = obj.obj;
			}
		}else{
			obj = str;
		}
		
		this.seriObj(obj);
	}
	seriObj(obj){
		//do something
	}
	toSeriObj(){
		let gsObj = this.genSeriObj();
		if(gsObj){
			gsObj = jsonSeriableUtil.jsonSeriObj(gsObj);
		}
		
		return {
			obj: gsObj,
			type:jsonSeriableUtil.jsonSeriObj(this.#seriType),
			version:this.#seriVersion,
			_seriUniCode: seriUniCode
		};
	}
	
	get seriType(){
		return this.#seriType;
	}
	set seriType(s){
		this.#seriType = s;
	}
	get seriVersion(){
		return this.#seriVersion;
	}
	
	
}